/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.javahispano.javacup.modelo;

/**
 * Clase que al extenderla permite definir trayectorias por tramos.
 * Luego de manera recursiva se pueden  valor de la trayectoria en
 * cualquier instante de tiempo futuro.
 * @author fabnun
 */
public abstract class AbstractTrayectoria {

    public final double vx0, vy0, x0, y0;
    public final double t0;

    /**Indica se entre el instante t0 y t1 ocurrio en rebote*/
    public boolean rebote1(double t0, double t1) {
        AbstractTrayectoria tr0 = getTrayectoria(t0);
        AbstractTrayectoria tr1 = getTrayectoria(t1);
        return (tr0 instanceof TrayectoriaAire && tr1 instanceof TrayectoriaAire && tr0 != tr1);
    }

    /**Retorna la trayectoria que retorna valores en un instante especifico*/
    public AbstractTrayectoria getTrayectoria(double time) {
        if (this instanceof TrayectoriaAire) {
            if (time < t0) {
                return this;
            } else {
                TrayectoriaAire tr0 = (TrayectoriaAire) this;
                return tr0.nextTrayectory.getTrayectoria(time - t0);
            }
        } else {
            return this;
        }
    }

    /*Constructor por defecto*/
    public AbstractTrayectoria(double vx0, double vy0, double x0, double y0) {
        this.vx0 = vx0;
        this.vy0 = vy0;
        this.x0 = x0;
        this.y0 = y0;
        this.t0 = getT0();
    }

    /**Coordenada horizontal de la trayectoria en el instante t*/
    public abstract double getX(double t);

    /**Coordenada vertical de la trayectoria en el instante t*/
    public abstract double getY(double t);

    /**Instante hasta donde es valida la trayectoria*/
    public abstract double getT0();
}
